/**
 * @author 2019/7/22 11:08 by 刘赵强
 * 多线程下的单利模式代码写法
 * 1.定义对象
 * 2.私有化构造方法
 * 3.提供一个static的方法返回对象
 **/
public class Single {
    /**使用volatile关键字防止重排序，因为 new Instance()是一个非原子操作，可能创建一个不完整的实例**/
    private static volatile  Single single = null;

    private Single(){

    }

    /**
     * 1.分配一块内存空间
     * 2.在这块内存上初始化一个 singleton的实例
     * 3.将声明的引用instance指向这块内存
     *
     * 线程一进入，在new对象的时候 由于指令重排  single先分配一块内存空间
     * 线程二进入，在第一个if判断的时候 single不是null 直接返回
     * 而真实情况是 线程一new对象还未完成  线程二返回的就是null
     * @return
     */
    public static Single getInstance(){
        if(single == null){
            synchronized (Single.class){
                if(single == null){
                    single = new Single();
                }
            }
        }
        return single;
    }

}
